import { isNumber } from "lodash-es";

/**
 * @description 处理toFixed精度问题
 * @date 06/03/2023
 * @export
 * @param {number} num
 * @param {number} [decimals=2] 保留小数位
 */
export function formatToFixed(num, decimals = 2) {
  if (num === undefined) return '';
  return (
    Math.round((parseFloat(num.toString()) + Number.EPSILON) * Math.pow(10, decimals)) /
    Math.pow(10, decimals)
  ).toFixed(decimals);
}

/**
** 乘法函数，用来得到精确的乘法结果
** 说明：javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
** 调用：accMul(arg1,arg2)
** 返回值：arg1乘以 arg2的精确结果
**/
export function accMul(arg1, arg2) {
  var m = 0,
    s1 = arg1.toString(),
    s2 = arg2.toString();
  try {
    m += s1.split('.')[1].length;
  } catch (e) { }
  try {
    m += s2.split('.')[1].length;
  } catch (e) { }
  return (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) / Math.pow(10, m);
}

export const DEFAULT_SYMBOL = '￥'

/**
 * 格式化货币金额
 * @param arg 格式化选项或金额
 * @returns 格式化后的货币金额
 */
export function formatMoney(arg) {
  let options = {
    money: 0,
    isShowFree: true,
    symbol: '￥',
    decimals: 2,
    format: 'string'
  }

  // 如果传入的参数是数字，则设置为选项中的金额
  if (isNumber(arg)) {
    options.money = arg
  } else {
    // 否则将传入的参数解构赋值给选项对象
    options = { ...options, ...arg }
  }

  let result = '免费'

  // 如果金额小于等于0且需要显示免费，则直接返回免费
  if (options.money <= 0 && options.isShowFree) return result

  // 对金额进行四舍五入处理
  const resMoney = formatToFixed(options.money, options.decimals)


  // 根据格式选项返回格式化后的结果
  if (options.format === 'string') return `${options.symbol}${resMoney}`
  else return { symbol: options.symbol, money: resMoney }

  // 可选：使用Intl.NumberFormat对象进行国际化格式化处理
  // try {
  //   result = new Intl.NumberFormat('zh-CN', {
  //     style: 'currency',
  //     currency: 'CNY',
  //     currencyDisplay: 'symbol',
  //     maximumFractionDigits: options.decimals
  //   }).format(options.money)
  // } catch (error) {
  //   result = `${options.symbol}${formatToFixed(options.money, options.decimals)}`
  //   // return formatToFixed(money).replace(/\B(?=(\d{3})+\b)/g, ",")
  //   //   .replace(/^/, `${symbol}`)
  // }
}

/**

将给定的数值转换为千米单位的字符串表示
@param m 待转换的数值
@returns 转换后的字符串，如果数值小于1000，则以米为单位，否则以千米为单位 */
export function kmUnit(m) {
  if (isNumber(m)) {
    return m >= 1000 ? (m / 1000).toFixed(2) + 'km' : parseInt(m.toString()) + 'm';
  } else {
    return '0m';
  }
}


export function formatNumberToCurrency(number) {
  // 如果数字是整数，则转换成两位小数的形式
  if (Number.isInteger(number)) {
    return number.toFixed(2);
  }

  // 如果数字已经有两位小数，则保持不变
  var decimalPart = number.toString().split('.')[1];
  if (decimalPart && decimalPart.length === 2) {
    return number.toString();
  }

  // 对于其他情况，在末尾补零，保持两位小数的形式
  return number.toFixed(2);
}